package com.zzh.partnersys.ai.util;
/**
 * 线程上下文工具类：存储线程隔离的 user_id 和 assistant_id
 */
public class ThreadLocalContext {

    // 1. 定义 ThreadLocal 存储容器（泛型为自定义上下文对象）
    private static final ThreadLocal<ContextData> THREAD_LOCAL = new ThreadLocal<>();

    // 2. 内部静态类：封装需要存储的上下文数据（仅包含必要字段）
    private static class ContextData {
        private Long userId;     // 用户ID
        private Long assistantId;// 助手ID

        // 构造器（确保字段非空）
        public ContextData(Long userId, Long assistantId) {
            if (userId == null) {
                throw new IllegalArgumentException("user_id 不能为空");
            }
            if (assistantId == null) {
                throw new IllegalArgumentException("assistant_id 不能为空");
            }
            this.userId = userId;
            this.assistantId = assistantId;
        }

        // getter（无 setter，避免线程内被篡改）
        public Long getUserId() {
            return userId;
        }

        public Long getAssistantId() {
            return assistantId;
        }
    }

    // 3. 对外提供：设置上下文（在线程开始时调用，如接口入口、任务启动时）
    public static void setContext(Long userId, Long assistantId) {
        THREAD_LOCAL.set(new ContextData(userId, assistantId));
    }

    // 4. 对外提供：获取 user_id（后续构建索引名、业务逻辑用）
    public static Long getUserId() {
        ContextData context = THREAD_LOCAL.get();
        if (context == null) {
            throw new IllegalStateException("线程上下文未初始化，请先调用 setContext 方法设置 user_id 和 assistant_id");
        }
        return context.getUserId();
    }

    // 5. 对外提供：获取 assistant_id
    public static Long getAssistantId() {
        ContextData context = THREAD_LOCAL.get();
        if (context == null) {
            throw new IllegalStateException("线程上下文未初始化，请先调用 setContext 方法设置 user_id 和 assistant_id");
        }
        return context.getAssistantId();
    }

    // 6. 对外提供：清除上下文（关键！避免线程池复用导致内存泄漏）
    public static void clearContext() {
        THREAD_LOCAL.remove(); // 必须调用 remove()，而非 set(null)
    }

    // 私有构造器：禁止实例化工具类
    private ThreadLocalContext() {}
}